package com.hulk.rpc.invoke;

import com.hulk.rpc.param.MethodParam;

import java.lang.reflect.Method;

/**
 * @author xuxukang
 * @date 2019-03-17 21:56
 */
public interface Invoker<T> {

  /**
   * 每种调用方式都必须实现的调用方法的实现
   *
   * @param params 参数
   * @return
   */
  T invoke(Object... params);

  default T invoke() {
    return invoke(new Object[]{});
  }

  default T invoke(Object param1) {
    return invoke(new Object[]{param1});
  }

  default T invoke(Object param1, Object param2) {
    return invoke(new Object[]{param1, param2});
  }

  default T invoke(Object param1, Object param2, Object param3) {
    return invoke(new Object[]{param1, param2, param3});
  }

  default T invoke(Object param1, Object param2, Object param3, Object param4) {
    return invoke(new Object[]{param1, param2, param3, param4});
  }

  /**
   * @return 接口实现类对应Id
   */
  default int getServiceId() {
    throw new UnsupportedOperationException("not support getServiceId");
  }

  /**
   * @return 要调用的方法
   */
  default Method getMethod() {
    throw new UnsupportedOperationException("not support getMethod");
  }

  /**
   * @return 调用方法的所有参数类型
   */
  default Class<?>[] getParamsTypes() {
    throw new UnsupportedOperationException("not support getParamsType");
  }

  /**
   * @return 要调用方法的所有参数名称s
   */
  default String[] getParamsNames() {
    throw new UnsupportedOperationException("not support getParamsName");
  }

  default public Class<? extends MethodParam> getMethodParamClass() {
    throw new UnsupportedOperationException();
  }

  /**
   * @return 是否支持http协议
   */
  default boolean supportHttpForm() {
    return false;
  }

}
